/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.evangelion.core.daoImpl;

import com.evangelion.core.bean.FacturaAlumno;
import com.evangelion.core.bean.Seccione;
import com.evangelion.core.dao.FacturaAlumnoDao;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.Query;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author Kellycasma
 */
@Component
@Transactional
public class FacturaAlumnoDaoImpl extends AbstractDAO implements FacturaAlumnoDao {

    @Override
    public List<FacturaAlumno> findByRangeDate(Seccione seccion, String nif, Date fechadesde, Date fechahasta, int start, int max) {
        Map<String, Object> pMap = new HashMap<String, Object>();
        String sql = "SELECT f FROM FacturaAlumno f WHERE 1=1 ";

        if (null != seccion) {
            sql += " and f.seccion = :seccion ";
            pMap.put("seccion", seccion);
        }

        if (StringUtils.isNotEmpty(nif)) {
            sql += " and (f.alumno.nif LIKE :nif OR f.alumno.nombres LIKE :nif OR f.alumno.apellidos LIKE :nif) ";
            pMap.put("nif", "%" + nif + "%");
        }

        boolean datesearch = ((fechadesde != null) && (fechahasta != null)) ? true : false;
        if (datesearch) {
            sql += "  AND f.fechafactura>=:fechadesde AND f.fechafactura<=:fechahasta";
            pMap.put("fechadesde", fechadesde);
            pMap.put("fechahasta", fechahasta);
            datesearch = true;
        }
        sql += " order by f.fechafactura DESC";

        System.out.println(sql);

        Query q = em.createQuery(sql);

        for (String key : pMap.keySet()) {
            q.setParameter(key, pMap.get(key));
        }

        q.setFirstResult(start);
        q.setMaxResults(max);

        System.out.println("Cantidad de registros:" + q.getResultList().size());

        return q.getResultList();
    }

    @Override
    public List<Object[]> matriculasMensuales(Seccione seccion, Date fechadesde, Date fechahasta) {
        Query q = em.createNativeQuery("select COUNT(id), MONTHNAME(fechafactura) from facturas_alumnos  WHERE fechafactura>=? AND fechafactura<=? AND id_seccion=? GROUP BY (YEAR(fechafactura)),(MONTH(fechafactura))");

        q.setParameter(1, fechadesde);
        q.setParameter(2, fechahasta);
        q.setParameter(3, seccion.getId());
        return q.getResultList();
    }

    @Override
    public List<Object[]> matriculasMensualesPermiso(Seccione seccion, Date fechadesde, Date fechahasta, String permiso) {
        Query q;
        if (permiso != null) {
            q = em.createNativeQuery("select COUNT(id), MONTHNAME(fechafactura), servicio from facturas_alumnos  WHERE fechafactura>=? AND fechafactura<=? AND id_seccion=? GROUP BY (YEAR(fechafactura)),(MONTH(fechafactura)),servicio");
            q.setParameter(4, permiso);
        } else {
            q = em.createNativeQuery("select COUNT(id), MONTHNAME(fechafactura), servicio from facturas_alumnos  WHERE fechafactura>=? AND fechafactura<=? AND id_seccion=? GROUP BY (YEAR(fechafactura)),(MONTH(fechafactura)),servicio");

        }

        q.setParameter(1, fechadesde);
        q.setParameter(2, fechahasta);
        q.setParameter(3, seccion.getId());

        return q.getResultList();
    }

    @Override
    public void save(FacturaAlumno facalumno) {
        super.save(facalumno);
    }

    @Override
    public FacturaAlumno findObjByParam(String parametro, String valor) {
        return (FacturaAlumno) findObjByParam(FacturaAlumno.class, parametro, valor);
    }

    @Override
    public List<FacturaAlumno> findListByParam(String parametro, String valor) {
        return findListByParam(FacturaAlumno.class, parametro, valor);
    }

    @Override
    public int countPage(Seccione seccion, String valor, Date fechadesde, Date fechahasta) {
        String sql = "SELECT  COUNT(f.id) FROM FacturaAlumno f WHERE (f.alumno.nif LIKE :nif OR f.alumno.nombres LIKE :nif OR f.alumno.apellidos LIKE :nif) AND f.seccion = :seccion ";
        boolean datesearch = ((fechadesde != null) && (fechahasta != null)) ? true : false;
        if (datesearch) {
            sql += " AND f.fechafactura>=:fechadesde AND f.fechafactura<=:fechahasta";
        }
        Query q = em.createQuery(sql);

        q.setParameter("seccion", seccion);
        q.setParameter("nif", "%" + valor + "%");
        if (datesearch) {
            q.setParameter("fechadesde", fechadesde);
            q.setParameter("fechahasta", fechahasta);
        }
        return ((Number) q.getSingleResult()).intValue();
    }

    public int getIdFactura() {
        String sql = "SELECT max(fa.id) from FacturaAlumno fa";
        Query q = em.createQuery(sql);
        try {
            return Integer.parseInt("" + q.getSingleResult());
        } catch (Exception e) {
            return 1;
        }
    }
}
